// 数据属性 ：configurable enumerable writable value 可以直接定义，可以不通过Object.defineProperty设置
// 访问器属性：configurable enumerable get方法 set方法 必须提供Object.defineProperty 设置

let obj = {
  _year: 2023,
  editor: 0
}

Object.defineProperty(obj, "year", {
  configurable: true,
  enumerable: true,
  get: function () {
    return this._year
  },
  set: function (newYear) {
    if (newYear != this._year) {
      this._year = newYear
      this.editor++
    }
  }
})

obj.year = 2044

function a() {
  console.log(this);
}

// a()

// var a = 10;

// function foo() {
//   // 当函数内部有变量a时，会产生局部作用域，外界全局作用域中的a不会对函数内部造成影响
//   // 如果把函数内部的变量a注释掉是，函数内部的a输出的就是全局作用域中的a
//   console.log(a); //undefined
//   var a = 100;
//   console.log(a); // 100

//   function fn() {
//     console.log(a); //undefined  这里undefined的原因是它先找自己的变量a 因为变量声明提升的原因导致当前a的值为undefined
//     var a = 200;
//     console.log(a); // 200
//   }
//   fn()
// }
// foo()


var a = 100
function F1() {
  var b = 200
  var a = 2
  console.log(a)
  function F2() {
    var c = 300
    console.log(a) // 自由变量，顺作用域链向父作用域找 //100
    console.log(b) // 自由变量，顺作用域链向父作用域找 //200
    console.log(c) // 本作用域的变量  //300
  }
  F2()
}
F1()

// call(对象,实参列表)
// apply(对象,实参列表数组)
// bind(对象)(实参列表) 或者 bind(对象,实参列表)

let b = {
  name: "廖刘龙",
  age: 23
}
let c = []
let d = true
let res = Object.prototype.toString.call(Symbol())
// console.log(res);

let str = "ewrwr"

// console.log(str.constructor);

// Object.prototyoe.toString.call()

let str1 = 'My name is liao liu long My'
let str2 = str1.replace(/My/g, 'Im')
// console.log(str2);
let str4 = "abcdefgh"
// console.log(str4.padStart(10, '2'));
// console.log(this);
function test() {
  console.log(this);
}

test()